package vip.liux.backend.infrastructure.message;

import lombok.Data;
import lombok.Getter;

import java.beans.Transient;
import java.time.LocalDateTime;
import java.util.Arrays;

@Data
public class MessageRecord {
    @Getter
    public enum MessageStatus {
        /**
         * PENDING
         */
        PENDING("待处理", false),
        PROCESSING("处理中", false),
        SUCCESS("处理成功", true),
        FAILED("处理失败", false),
        RETRIED("已重试", false),
        DISCARDED("已丢弃", true),
        DEAD_LETTER("已进入死信队列", true),

        // 扩展状态
        STORED("已存储", false),
        DELAYED("已延迟", false),
        CANCELLED("已取消", true),
        TIMEOUT("已超时", false),
        RE_QUEUED("已重新入队", false);

        private final String description;  // 状态描述
        private final boolean terminal;    // 是否为终结状态（不可再变更）

        MessageStatus(String description, boolean terminal) {
            this.description = description;
            this.terminal = terminal;
        }
        /*
            PENDING → PROCESSING → SUCCESS
                            ↗
                       RETRIED
                            ↘
            PENDING → DELAYED → PENDING
                            ↘
            FAILED → DEAD_LETTER
         */

        // 示例：判断是否允许状态变更
        public boolean canTransitionTo(MessageStatus newStatus) {
            if (this.terminal) return false;  // 终结状态不允许变更

            // 根据业务规则添加状态流转逻辑（示例）
            return switch (this) {
                case PENDING ->
                        newStatus == PROCESSING || newStatus == CANCELLED || newStatus == DELAYED;
                case PROCESSING ->
                        newStatus == SUCCESS || newStatus == FAILED || newStatus == TIMEOUT;
                case FAILED ->
                        newStatus == RETRIED || newStatus == DEAD_LETTER;
                case RETRIED ->
                        newStatus == PENDING || newStatus == DEAD_LETTER;
                default -> false;
            };
        }
    }

    // 消息唯一标识（UUID或雪花ID）
    private Long messageId;

    // 业务关联ID（如订单ID、用户ID）
    private String bizId;

    // 消息状态：0-待处理,1-已发送,2-消费成功,3-消费失败,4-已重试
    /**
     * @see MessageStatus
     */
    private Integer messageStatus;

    // 重试次数
    private Integer retryCount;

    // 下一次重试时间
    private LocalDateTime nextRetryTime;

    // 消息类型（如支付通知、库存扣减）
    private String messageType;

    // 消息内容（JSON格式）
    private String messageContent;

    // 来源系统（如order-service）
    private String sourceSystem;

    // 目标系统或队列（如kafka:order_topic）
    private String targetSystem;

    // 创建时间
    private LocalDateTime createdTime;

    // 最后更新时间
    private LocalDateTime updatedTime;

    // 错误信息
    private String errorMessage;

    // 辅助方法：获取状态枚举
    @Transient
    public MessageStatus getStatusEnum() {
        return Arrays.stream(MessageStatus.values())
                .filter(e -> e.ordinal() == this.messageStatus)
                .findFirst()
                .orElse(MessageStatus.PENDING);
    }

    // 辅助方法：设置状态枚举
    @Transient
    public void setStatusEnum(MessageStatus status) {
        this.messageStatus = status.ordinal();
    }
}
